/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.upn.sigemfi.vfi.beans;

import edu.upn.sigemfi.ope.be.Moneda;
import edu.upn.sigemfi.plt.be.Cuenta;
import edu.upn.sigemfi.vfi.bc.CuentaDelegate;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;


//datos del cliente
import edu.upn.sigemfi.plt.be.DetalleCuentaCliente;
import edu.upn.sigemfi.plt.be.DetalleCuentaClientePK;
import edu.upn.sigemfi.plt.be.EstadoCuenta;
import edu.upn.sigemfi.plt.be.TarjetaDebito;
import edu.upn.sigemfi.seg.be.PersonaJuridica;
import edu.upn.sigemfi.seg.be.PersonaNatural;
import edu.upn.sigemfi.seg.beans.IUController;
import edu.upn.sigemfi.vfi.bc.CuentaClienteDelegate;
import edu.upn.sigemfi.vfi.bc.DetalleCajaDelegate;
import edu.upn.sigemfi.vfi.bc.DetalleTransaccionDelegate;
import edu.upn.sigemfi.vfi.bc.PersonaDelegate;
import edu.upn.sigemfi.vfi.bc.SaldoCajaDelegate;
import edu.upn.sigemfi.vfi.bc.TarjetaDebitoDelegate;
import edu.upn.sigemfi.vfi.bc.TranFinancieraDelegate;
import edu.upn.sigemfi.vfi.be.Caja;
import edu.upn.sigemfi.vfi.be.DetalleCaja;
import edu.upn.sigemfi.vfi.be.DetalleTransaccion;
import edu.upn.sigemfi.vfi.be.SaldoCaja;
import edu.upn.sigemfi.vfi.be.TipoTransaccion;
import edu.upn.sigemfi.vfi.be.TranFinanciera;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

//transaccion
/**
 *
 * @author Alexis
 */
public class CuentaController extends AbstractController {

    private CuentaDelegate delegado;
    private Cuenta cuenta;
    private Double monto;
    // Datos Validacion Ingreso Deposito
    private String tipoIngreso;
    private boolean documento = true;
    private boolean verCuentas;
    private boolean validacion = false;
    private String tipoOperacion;
    //cuenta a buscar
    private Cuenta cuentaBuscada;
    private String nroCuenta;
    //datos cliente
    private CuentaClienteDelegate delegadoCuentaCliente;
    private DetalleCuentaCliente cuentaCliente;
    private DetalleCuentaClientePK detalleCuentaClientePK;
    private PersonaNatural personaNatural;
    private PersonaDelegate delegadoPersonaNatural;
    private PersonaJuridica personaJuridica;
    private PersonaDelegate delegadoPersonaJuridica;
    //tipo dcoumento y nro doc
    private String tipoDocumento;
    private String nroDocumento;
    private String titular;
    //transaccion
    private TranFinanciera tranFinanciera;
    private Double montoDeposito;
    private DetalleTransaccion detalleTransaccion;
    private TranFinancieraDelegate delegadoTranFinanciera;
    private DetalleTransaccionDelegate delegadoDetalleTransaccion;
    private TipoTransaccion tipoTransaccion;
    //Caja
    private DetalleCajaDelegate delegadoDetalleCaja;
    private DetalleCaja detalleCaja;
    private Caja caja;
    private SaldoCajaDelegate delegadoSaldoCaja;
    private SaldoCaja saldoCaja;
    //Tarjeta
    private String nroTarjeta;
    private String clave;
    private boolean validacionTarjeta = false;
    private TarjetaDebitoDelegate delegadoTarjetaDebito;
    private TarjetaDebito tarjetaDebito;
    //retiro
    private String nrDocumento;
    private Double montoRetiro;
    //transferencia
    private String nroCtaDestino;
    private Cuenta ctaTransferencia;
    private DetalleCuentaCliente cuentaClienteTransferencia;
    private PersonaNatural personaNaturalTransferencia;
    private PersonaJuridica personaJuridicaTransferencia;
    private String titularTransferencia;
    private Double montoTransferencia;

    public CuentaController() {
        //tbn en nuevo
        this.verCuentas = false;
        this.tipoOperacion = "deposito";
        this.validacionTarjeta = false;

        //   tipoTransaccion = new TipoTransaccion();
        //   this.tipoTransaccion.setNombre("deposito");
        //tipoTransaccion.setNombre("deposito");
        cuenta = new Cuenta();
        delegado = new CuentaDelegate();
        tranFinanciera = new TranFinanciera();
        detalleTransaccion = new DetalleTransaccion();
        //caja
        detalleCaja = new DetalleCaja();
        caja = new Caja();


        UsuarioVentanillaController usuarioLogeado = (UsuarioVentanillaController) getBean("UsuarioVentanillaController");

        caja = usuarioLogeado.getCaja();
        //  caja.setFidOpeVentanilla(usuarioLogeado.getCaja().getFidOpeVentanilla());
        // caja.setIdCaja(usuarioLogeado.getCaja().getIdCaja());
        //  caja.setNombre("Caja 1");
        //  caja.se
        saldoCaja = new SaldoCaja();


        tipoTransaccion = new TipoTransaccion();
        tipoTransaccion.setIdTipoTransaccion(Long.parseLong("1"));
        tipoTransaccion.setNombre("Deposito");




        //datos cliente

        cuentaCliente = new DetalleCuentaCliente();
        detalleCuentaClientePK = new DetalleCuentaClientePK();
        delegadoCuentaCliente = new CuentaClienteDelegate();
        personaNatural = new PersonaNatural();
        personaJuridica = new PersonaJuridica();
        delegadoPersonaNatural = new PersonaDelegate();
        delegadoPersonaJuridica = new PersonaDelegate();
        delegadoTranFinanciera = new TranFinancieraDelegate();
        delegadoDetalleTransaccion = new DetalleTransaccionDelegate();



        //caja

        delegadoDetalleCaja = new DetalleCajaDelegate();
        delegadoSaldoCaja = new SaldoCajaDelegate();
        //tarjeta
        tarjetaDebito = new TarjetaDebito();
        delegadoTarjetaDebito = new TarjetaDebitoDelegate();




//usuario ventanilla




    }

    //Lista de cuentas
    public List<Cuenta> getCuentas() {
        try {
            return delegado.listar();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public List<Cuenta> getCuentasPorDocumento() {

        try {


            if (tipoDocumento.equals("dni")) {
                try {

                    return delegado.buscarCuentasPorDni(nrDocumento);

                } catch (Exception e) {
                    //    return null;
                }
                error("No existen cuentas asociadas al " + tipoDocumento + " " + nrDocumento);


            } else {

                if (tipoDocumento.equals("ruc")) {

                    try {
                        return delegado.buscarCuentasPorRuc(nrDocumento);

                    } catch (Exception e) {
                        //return null;
                    }
                    error("No existen cuentas asociadas al " + tipoDocumento + " " + nrDocumento);



                }
            }


        } catch (Exception e) {


            error("El " + tipoDocumento + " " + nrDocumento + "no es valido ..." + e.getMessage());
        }
        return null;
    }

    public List<Cuenta> getCuentasPorTarjeta() {

        try {

            //    if (documento == false) {

            return delegado.buscarCuentaPorTarjeta(delegadoTarjetaDebito.buscarTarjetaPorNroTarjeta(nroTarjeta, clave));
        //  }

        } catch (Exception e) {
            // e.printStackTrace();

            error("La Tarjeta " + nroTarjeta.toString() + " no es valida " + e.getMessage());

        }
        error("La Tarjeta " + nroTarjeta.toString() + " no es valida ");
        return null;
    }

    //Buscar Cuenta por nro de Cuenta
    public boolean buscarPorNroCuenta() throws Exception {
        try {
            cuentaBuscada = delegado.buscarPorNroCuenta(nroCuenta);//local.find(codigo);
            //  delegado.buscarPorNroCuenta(nroCuenta).


            return true;
        } catch (Exception e) {
            //    local = lookupCuentaFacade();
            return false;
        // throw new Exception("Buscar por nro de Cuenta. " + e.getMessage(), e);
        }
    }

    public boolean buscarCuentaTransferenciaPorNroCuenta() throws Exception {
        try {
            ctaTransferencia = delegado.buscarPorNroCuenta(nroCtaDestino);//local.find(codigo);
            //  delegado.buscarPorNroCuenta(nroCuenta).


            return true;
        } catch (Exception e) {
            //    local = lookupCuentaFacade();
            return false;
        // throw new Exception("Buscar por nro de Cuenta. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> getCuentasPorMonto() {
        try {
            return delegado.listarPorMontoActual(monto);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String nuevo() {
        cuenta = new Cuenta();
        return "nuevo";
    }

    public String registrar() {
        try {
            delegado.crear(cuenta);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "volver";
    }

    public Cuenta getCuenta() {
        return cuenta;
    }

    public void setCuenta(Cuenta cuenta) {
        this.cuenta = cuenta;
    }

    /**
     * @return the monto
     */
    public Double getMonto() {
        return monto;
    }

    /**
     * @param monto the monto to set
     */
    public void setMonto(Double monto) {
        this.monto = monto;
    }

    /**
     * @return the tipoIngreso
     */
    public String getTipoIngreso() {
        return tipoIngreso;
    }

    /**
     * @param tipoIngreso the tipoIngreso to set
     */
    public void setTipoIngreso(String tipoIngreso) {
        this.tipoIngreso = tipoIngreso;
    }

    /**
     * @return the documento
     */
    public boolean isDocumento() {
        return documento;
    }

    /**
     * @param documento the documento to set
     */
    public void setDocumento(boolean documento) {
        this.documento = documento;
    }

    public String Cancelar() {
        verCuentas = false;
        this.setTipoOperacion("Deposito");
        validacionTarjeta=false;
        return "volver";
    }

    public String SeleccionIngreso(ValueChangeEvent evt) {
        String nuevoValor = (String) evt.getNewValue();
        documento = nuevoValor.equals("documento") ? true : false;

        if (nuevoValor.equals("documento")) {

            validacionTarjeta = false;


        }
        setVerCuentas(true);
        return "";
    }

    public String ValidarIngresoDeposito() {
        if (tipoIngreso.compareTo("documento") != 0) {
            verCuentas = false;
            //verCuentas = true;
            validacionTarjeta = true;
            getCuentasPorTarjeta();
            return "validar";
        //validacionTarjeta =

        }

        //conseguir y validar la cuenta

        try {

            if (buscarPorNroCuenta()) {
                //      mostrarMensaje("Bien","bien",FacesMessage.SEVERITY_FATAL);

                getdatosCliente();
                return "deposito";

            } else {
                error("La Cuenta " + nroCuenta.toString() + " no es valida ");
            }


        } catch (Exception e) {

            error(e.getMessage().toString());

        }
        return null;

    }

    public String ValidarIngresoTransferencia() {
//        if (tipoIngreso.compareTo("documento") != 0) {
        verCuentas = false;
//            //verCuentas = true;
        validacionTarjeta = true;
//       //     getCuentasPorTarjeta();
//            return "validar";
//            //validacionTarjeta =
//
//        }

        //conseguir y validar la cuenta

        try {

            if (buscarCuentaTransferenciaPorNroCuenta()) {
                //      mostrarMensaje("Bien","bien",FacesMessage.SEVERITY_FATAL);

                getdatosClienteTransferencia();
                return "";

            } else {
                error("La Cuenta " + nroCtaDestino.toString() + " no es valida ");
                return null;
            }


        } catch (Exception e) {

            error(e.getMessage().toString());

        }
        return null;

    }

    /**
     * @return the verCuentas
     */
    public boolean isVerCuentas() {
        return verCuentas;
    }

    /**
     * @param verCuentas the verCuentas to set
     */
    public void setVerCuentas(boolean verCuentas) {
        this.verCuentas = verCuentas;
    }

    public String Validar() {
        //Codigo para validar
        if (tipoTransaccion.getNombre().compareTo("Deposito") == 0) {
            validacionTarjeta = false;
            return tipoTransaccion.getNombre();
        }


        //    nrDocumento
        verCuentas = true;

        if (tipoIngreso.equals("documento")) {

            verCuentas = true;
            validacionTarjeta = false;


        }

        if (tipoIngreso.equals("tarjeta")) {

            validacionTarjeta = true;
            verCuentas = false;


        }



        return "listar";
    }

    public String RealizarOperacion() {

        try {

            //   if (buscarPorNroCuenta()) {
            //      mostrarMensaje("Bien","bien",FacesMessage.SEVERITY_FATAL);

            getdatosCliente();
            if (validacionTarjeta) {
                validacionTarjeta = false;
                verCuentas = true;
            } else {
                validacionTarjeta = true;
                verCuentas = false;
            }






            //          if (tipoTransaccion.getNombre().equals("Deposito")) {
            //          return getTipoOperacion();
//
            //    }

            return tipoTransaccion.getNombre();//getTipoOperacion();

        // } else {
        //   error("La Cuenta " + nroCuenta.toString() + " no es valida ");
        // }


        } catch (Exception e) {

            error(e.getMessage());
        //return "";

        }
        return null;

    }

    /**
     * @return the validacion
     */
    public boolean isValidacion() {
        validacion = getTipoOperacion().equals("Deposito") ? false : true;
        return validacion;
    }

    /**
     * @param validacion the validacion to set
     */
    public void setValidacion(boolean validacion) {
        this.validacion = validacion;
    }

    /**
     * @return the tipoOperacion
     */
    public String getTipoOperacion() {
        return tipoOperacion;
    }

    /**
     * @param tipoOperacion the tipoOperacion to set
     */
    public void setTipoOperacion(String tipoOperacion) {
        this.tipoOperacion = tipoOperacion;
    }

    /**
     * @return the cuentaBuscada
     */
    public Cuenta getCuentaBuscada() {
        return cuentaBuscada;
    }

    /**
     * @param cuentaBuscada the cuentaBuscada to set
     */
    public void setCuentaBuscada(Cuenta cuentaBuscada) {
        this.cuentaBuscada = cuentaBuscada;
    }

    /**
     * @return the nroCuenta
     */
    public String getNroCuenta() {
        return nroCuenta;
    }

    /**
     * @param nroCuenta the nroCuenta to set
     */
    public void setNroCuenta(String nroCuenta) {
        this.nroCuenta = nroCuenta;
    }

    public Double getMontoDeposito() {
        return montoDeposito;
    }

    /**
     * @param montoDeposito the montoDeposito to set
     */
    public void setMontoDeposito(Double montoDeposito) {
        this.montoDeposito = montoDeposito;
    }

    public DetalleTransaccion getDetalleTransaccion() {
        return detalleTransaccion;
    }

    /**
     * @param detalleTransaccion the detalleTransaccion to set
     */
    public void setDetalleTransaccion(DetalleTransaccion detalleTransaccion) {
        this.detalleTransaccion = detalleTransaccion;
    }

    /**
     * @return the personaNatural
     */
    public PersonaNatural getPersonaNatural() {
        return personaNatural;
    }

    /**
     * @param personaNatural the personaNatural to set
     */
    public void setPersonaNatural(PersonaNatural personaNatural) {
        this.personaNatural = personaNatural;
    }

    /**
     * @return the tipoDocumento
     */
    public String getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public String getNroDocumento() {
        return nroDocumento;
    }

    public void setNroDocumento(String nroDocumento) {
        this.nroDocumento = nroDocumento;
    }

    /**
     * @return the personaJuridica
     */
    public PersonaJuridica getPersonaJuridica() {
        return personaJuridica;
    }

    /**
     * @param personaJuridica the personaJuridica to set
     */
    public void setPersonaJuridica(PersonaJuridica personaJuridica) {
        this.personaJuridica = personaJuridica;
    }

    /**
     * @return the titular
     */
    public String getTitular() {
        return titular;
    }

    /**
     * @param titular the titular to set
     */
    public void setTitular(String titular) {
        this.titular = titular;
    }

    /**
     * @return the tranFinanciera
     */
    public TranFinanciera getTranFinanciera() {
        return tranFinanciera;
    }

    /**
     * @param tranFinanciera the tranFinanciera to set
     */
    public void setTranFinanciera(TranFinanciera tranFinanciera) {
        this.tranFinanciera = tranFinanciera;
    }

    //DETALLES DE LA CUENTA Y EL CLIENTE
    public DetalleCuentaCliente getCuentaCliente() {
        return cuentaCliente;
    }

    public void setCuentaCliente(DetalleCuentaCliente cuentaCliente) {
        this.cuentaCliente = cuentaCliente;
    }

    //datos del cliente
    public void getdatosCliente() throws Exception {
        try {



            cuentaCliente = delegadoCuentaCliente.buscarPorCuenta(cuentaBuscada);


            if (cuentaCliente.getPersona().getXtipo().equals("PEN")) {

                tipoDocumento = "DNI";
                buscarPersona(cuentaCliente.getPersona().getIdPersona(), "PEN");
                nroDocumento = personaNatural.getDniPersona();
                titular = personaNatural.getApePaternoPersona() + " " + personaNatural.getApeMaternoPersona() + " " + personaNatural.getNombrePersona();


            } else {

                tipoDocumento = "RUC";
                buscarPersona(cuentaCliente.getPersona().getIdPersona(), "PEJ");
                nroDocumento = personaJuridica.getRuc();
                titular = personaJuridica.getRazonSocial();
            }




        //  delegado.buscarPorNroCuenta(nroCuenta);//local.find(codigo);


        //   return cuentaCliente;
        } catch (Exception e) {
            //    local = lookupCuentaFacade();

            error(e.getMessage().toString());

        //    throw new Exception("Buscar por nro de Cuenta. " + e.getMessage(), e);
        //   return null;
        }
    }

    public void getdatosClienteTransferencia() throws Exception {
        try {



            cuentaClienteTransferencia = delegadoCuentaCliente.buscarPorCuenta(ctaTransferencia);


            if (cuentaClienteTransferencia.getPersona().getXtipo().equals("PEN")) {

                tipoDocumento = "DNI";
                buscarPersonaTransferencia(cuentaClienteTransferencia.getPersona().getIdPersona(), "PEN");
                //  nroDocumento = personaNaturalTransferencia.getDniPersona();
                titularTransferencia = personaNaturalTransferencia.getApePaternoPersona() + " " + personaNaturalTransferencia.getApeMaternoPersona() + " " + personaNaturalTransferencia.getNombrePersona();


            } else {

                tipoDocumento = "RUC";
                buscarPersonaTransferencia(cuentaClienteTransferencia.getPersona().getIdPersona(), "PEJ");
                /// nroDocumento = personaJuridica.getRuc();
                titularTransferencia = personaJuridicaTransferencia.getRazonSocial();
            }




        //  delegado.buscarPorNroCuenta(nroCuenta);//local.find(codigo);


        //   return cuentaCliente;
        } catch (Exception e) {
            //    local = lookupCuentaFacade();

            error(e.getMessage().toString());

        //    throw new Exception("Buscar por nro de Cuenta. " + e.getMessage(), e);
        //   return null;
        }
    }

    //datos cliente persona
    public void buscarPersona(Long codigo, String tipo) {
        try {

            if (tipo.equals("PEN")) {
                setPersonaNatural(delegadoPersonaNatural.buscarPersonaNatural(codigo));

            } else {
                setPersonaJuridica(delegadoPersonaJuridica.buscarPersonaJuridica(codigo));
            }

        } catch (Exception e) {
            error(e.getMessage().toString());
        }
    // return null;
    }

    public void buscarPersonaTransferencia(Long codigo, String tipo) {
        try {

            if (tipo.equals("PEN")) {
                setPersonaNaturalTransferencia(delegadoPersonaNatural.buscarPersonaNatural(codigo));

            } else {
                setPersonaJuridicaTransferencia(delegadoPersonaJuridica.buscarPersonaJuridica(codigo));
            }

        } catch (Exception e) {
            error(e.getMessage().toString());
        }
    // return null;
    }

    //empieza transaccion
    public String registrarTransaccion() {



        try {
            UsuarioVentanillaController usuarioVentanilla = (UsuarioVentanillaController) getBean("UsuarioVentanillaController");


            detalleTransaccion = new DetalleTransaccion();
            detalleCaja = new DetalleCaja();
            saldoCaja = new SaldoCaja();
            //VERIFICAR QUE LA CUENTA NO ESTE CANCELADA

            if (cuentaCliente.getCuenta().getEstadoCuenta().toString().equals("Cancelado")) {

                error("La cuenta esta cancelada ");
                return null;

            }
            Date hora = new Date();
            //  tranFinanciera.setFechaHora(hora);
            //    tranFinanciera.setFidPltCuenta(cuentaBuscada);

            detalleTransaccion.setFechaHora(hora);
            detalleTransaccion.setFidPltCuenta(cuentaBuscada);
            detalleTransaccion.setFidSegUsuarioVentanilla(usuarioVentanilla.getUsuarioVentanilla());
            detalleTransaccion.setFidPltCuentaDestino(cuentaBuscada);
            detalleTransaccion.setMonto(BigDecimal.valueOf(montoDeposito));
            detalleTransaccion.setFidOpeMoneda(cuentaBuscada.getFidPltTipoCuenta().getFidOpeMoneda());
            detalleTransaccion.setTipoCambioActual(cuentaBuscada.getFidPltTipoCuenta().getFidOpeTipoCambio().getPrecioPromedio());
            detalleTransaccion.setFidVfiTipoTransaccion(tipoTransaccion);
            detalleTransaccion.setEstado(true);
            verCuentas = false;
            this.tipoOperacion = "deposito";
            this.tipoTransaccion.setNombre("Deposito");


            // delegadoTranFinanciera.crear(tranFinanciera);
            delegadoDetalleTransaccion.crear(detalleTransaccion);

            //actualizar la caja

            detalleCaja.setFecha(hora);
            detalleCaja.setFidVfiCaja(getCaja());
            detalleCaja.setFidVfiDetalleTransaccion(detalleTransaccion);

            delegadoDetalleCaja.crear(detalleCaja);

            try {

                if (buscarPorCajayMoneda(caja, detalleTransaccion.getFidOpeMoneda())) {


                    saldoCaja.setMonto(saldoCaja.getMonto() + Double.parseDouble(detalleTransaccion.getMonto().toString()));
                    delegadoSaldoCaja.editar(saldoCaja);



                } else {


                    saldoCaja.setFidOpeMoneda(detalleTransaccion.getFidOpeMoneda());
                    saldoCaja.setFidVfiCaja(caja);
                    saldoCaja.setMonto(Double.parseDouble(detalleTransaccion.getMonto().toString()));

                    delegadoSaldoCaja.crear(saldoCaja);




                }


                //ACTUALIZA LA CUENTA DEL CLIENTE
                //MONTO CON REPOSICION ITF
                cuentaBuscada.setMontoActual(cuentaBuscada.getMontoActual() + Double.parseDouble(detalleTransaccion.getMonto().toString()) - (Double.parseDouble(detalleTransaccion.getMonto().toString())) * cuentaBuscada.getTasaItf());

                delegado.editar(cuentaBuscada);





            } catch (Exception e) {

                error("Hubo un error" + e.getMessage());
            }








//detalleTransaccion.getIdTransaccion();

        } catch (Exception e) {
            e.printStackTrace();
        }
        validacionTarjeta = false;
        return "volver";
    }

    public String registrarTransaccionRetiro() {



        try {


            UsuarioVentanillaController usuarioVentanilla = (UsuarioVentanillaController) getBean("UsuarioVentanillaController");
            detalleTransaccion = new DetalleTransaccion();
            detalleCaja = new DetalleCaja();
            saldoCaja = new SaldoCaja();

            Date hora = new Date();
//VERIFICA SI LA CUENTA ESTA CANCELADA O NO
            if (cuentaCliente.getCuenta().getEstadoCuenta().toString().equals("Cancelado")) {

                error("La cuenta esta cancelada ");
                return null;

            }
            //VERIFICA MONTO DISPONIBLE EN LA CUENTA

            if (montoRetiro > cuentaBuscada.getMontoActual()) {

                error("No ahi suficiente dinero en la cuenta");
                return null;


            }
            //VERIFICA SI AHI DINERO DE ESE TIPO EN LA CAJA EN LA CAJA
            if (buscarPorCajayMoneda(caja, cuentaBuscada.getFidPltTipoCuenta().getFidOpeMoneda())) {


                if (montoRetiro > saldoCaja.getMonto()) {
                    error("No ahi dinero en la " + caja.getNombre());
                    return null;


                }


            } else {
                error("No ahi dinero del tipo " + cuentaBuscada.getFidPltTipoCuenta().getFidOpeMoneda().getDescripcion() + "en la " + caja.getNombre());
                return null;

            }

            //VERIFICA MONTO EN LA CAJA
            //  tranFinanciera.setFechaHora(hora);
            //    tranFinanciera.setFidPltCuenta(cuentaBuscada);
            //   detalleTransaccion.se
            detalleTransaccion.setFechaHora(hora);
            detalleTransaccion.setFidSegUsuarioVentanilla(usuarioVentanilla.getUsuarioVentanilla());
            detalleTransaccion.setFidPltCuenta(cuentaBuscada);
            detalleTransaccion.setFidPltCuentaDestino(cuentaBuscada);
            //detalleTransaccion.setf
            detalleTransaccion.setMonto(BigDecimal.valueOf(montoRetiro));
            detalleTransaccion.setFidOpeMoneda(cuentaBuscada.getFidPltTipoCuenta().getFidOpeMoneda());
            detalleTransaccion.setTipoCambioActual(cuentaBuscada.getFidPltTipoCuenta().getFidOpeTipoCambio().getPrecioPromedio());
            detalleTransaccion.setFidVfiTipoTransaccion(tipoTransaccion);
            detalleTransaccion.setEstado(true);
            verCuentas = false;
            this.tipoOperacion = "deposito";
            this.tipoTransaccion.setNombre("Deposito");


            // delegadoTranFinanciera.crear(tranFinanciera);
            delegadoDetalleTransaccion.crear(detalleTransaccion);

            //actualizar la caja

            detalleCaja.setFecha(hora);
            detalleCaja.setFidVfiCaja(getCaja());
            detalleCaja.setFidVfiDetalleTransaccion(detalleTransaccion);

            delegadoDetalleCaja.crear(detalleCaja);

            try {

                if (buscarPorCajayMoneda(caja, detalleTransaccion.getFidOpeMoneda())) {


                    saldoCaja.setMonto(saldoCaja.getMonto() - Double.parseDouble(detalleTransaccion.getMonto().toString()));
                    delegadoSaldoCaja.editar(saldoCaja);



                } else {


                    saldoCaja.setFidOpeMoneda(detalleTransaccion.getFidOpeMoneda());
                    saldoCaja.setFidVfiCaja(caja);
                    saldoCaja.setMonto(Double.parseDouble(detalleTransaccion.getMonto().toString()));

                    delegadoSaldoCaja.crear(saldoCaja);




                }


                //ACTUALIZA LA CUENTA DEL CLIENTE

                //  cuentaBuscada.setMontoActual(cuentaBuscada.getMontoActual() - Double.parseDouble(detalleTransaccion.getMonto().toString()));
                //MONTO CON REPOSICION ITF

                cuentaBuscada.setMontoActual(cuentaBuscada.getMontoActual() - Double.parseDouble(detalleTransaccion.getMonto().toString()) - (Double.parseDouble(detalleTransaccion.getMonto().toString())) * cuentaBuscada.getTasaItf());
                delegado.editar(cuentaBuscada);





            } catch (Exception e) {

                error("Hubo un erro consultadno saldo caja");
            }








//detalleTransaccion.getIdTransaccion();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "volver";
    }

    public String registrarTransaccionTransferencia() {



        try {
            UsuarioVentanillaController usuarioVentanilla = (UsuarioVentanillaController) getBean("UsuarioVentanillaController");
            detalleTransaccion = new DetalleTransaccion();
            detalleCaja = new DetalleCaja();
            saldoCaja = new SaldoCaja();

            Date hora = new Date();

            //VERIFICA SI LA CUENTA ESTA CANCELADA O NO
            if (cuentaCliente.getCuenta().getEstadoCuenta().toString().equals("Cancelado")) {

                error("La cuenta esta cancelada ");
                return null;

            }

            //VERIFICA MONTO DISPONIBLE EN LA CUENTA

            if (montoTransferencia > cuentaBuscada.getMontoActual()) {

                error("No ahi suficiente dinero en la cuenta");
                return null;


            }
            //  tranFinanciera.setFechaHora(hora);
            //    tranFinanciera.setFidPltCuenta(cuentaBuscada);

            detalleTransaccion.setFechaHora(hora);
            detalleTransaccion.setFidPltCuenta(cuentaBuscada);
            detalleTransaccion.setFidPltCuentaDestino(ctaTransferencia);
            detalleTransaccion.setFidSegUsuarioVentanilla(usuarioVentanilla.getUsuarioVentanilla());
            detalleTransaccion.setMonto(BigDecimal.valueOf(montoTransferencia));
            detalleTransaccion.setFidOpeMoneda(cuentaBuscada.getFidPltTipoCuenta().getFidOpeMoneda());
            detalleTransaccion.setTipoCambioActual(cuentaBuscada.getFidPltTipoCuenta().getFidOpeTipoCambio().getPrecioPromedio());
            detalleTransaccion.setFidVfiTipoTransaccion(tipoTransaccion);
            detalleTransaccion.setEstado(true);
            verCuentas = false;
            this.tipoOperacion = "deposito";
            this.tipoTransaccion.setNombre("Deposito");


            // delegadoTranFinanciera.crear(tranFinanciera);
            delegadoDetalleTransaccion.crear(detalleTransaccion);

            //actualizar la caja

//            detalleCaja.setFecha(hora);
//            detalleCaja.setFidVfiCaja(getCaja());
//            detalleCaja.setFidVfiDetalleTransaccion(detalleTransaccion);
//
//            delegadoDetalleCaja.crear(detalleCaja);
//
            try {

//                if (buscarPorCajayMoneda()) {
//
//
//                    saldoCaja.setMonto(saldoCaja.getMonto() - Double.parseDouble(detalleTransaccion.getMonto().toString()));
//                    delegadoSaldoCaja.editar(saldoCaja);
//
//
//
//                } else {
//
//
//                    saldoCaja.setFidOpeMoneda(detalleTransaccion.getFidOpeMoneda());
//                    saldoCaja.setFidVfiCaja(caja);
//                    saldoCaja.setMonto(Double.parseDouble(detalleTransaccion.getMonto().toString()));
//
//                    delegadoSaldoCaja.crear(saldoCaja);
//
//
//
//
//                }


                //ACTUALIZA LA CUENTA DEL CLIENTE

                cuentaBuscada.setMontoActual(cuentaBuscada.getMontoActual() - Double.parseDouble(detalleTransaccion.getMonto().toString()) - (Double.parseDouble(detalleTransaccion.getMonto().toString())) * cuentaBuscada.getTasaItf());
                //  cuentaBuscada.setMontoActual(cuentaBuscada.getMontoActual() - Double.parseDouble(detalleTransaccion.getMonto().toString()));
                delegado.editar(cuentaBuscada);

                //ACTUALZA LA CUENTA A TRANSFERIRç

                ctaTransferencia.setMontoActual(ctaTransferencia.getMontoActual() + Double.parseDouble(detalleTransaccion.getMonto().toString()));
                delegado.editar(ctaTransferencia);





            } catch (Exception e) {

                error("Hubo un erro consultadno saldo caja");
            }








//detalleTransaccion.getIdTransaccion();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "volver";
    }

    public String registrarTransaccionCancenlacion() {



        try {
            UsuarioVentanillaController usuarioVentanilla = (UsuarioVentanillaController) getBean("UsuarioVentanillaController");
            detalleTransaccion = new DetalleTransaccion();
            detalleCaja = new DetalleCaja();
            saldoCaja = new SaldoCaja();

            Date hora = new Date();
            //  tranFinanciera.setFechaHora(hora);
            //    tranFinanciera.setFidPltCuenta(cuentaBuscada);

            //VERIFICA SI LA CUENTA ESTA CANCELADA O NO
            if (cuentaCliente.getCuenta().getEstadoCuenta().toString().equals("Cancelado")) {

                error("La cuenta esta cancelada ");
                return null;

            }

            detalleTransaccion.setFechaHora(hora);
            detalleTransaccion.setFidPltCuenta(cuentaBuscada);
            detalleTransaccion.setFidPltCuentaDestino(cuentaBuscada);
            detalleTransaccion.setFidSegUsuarioVentanilla(usuarioVentanilla.getUsuarioVentanilla());
            detalleTransaccion.setMonto(BigDecimal.valueOf(Double.parseDouble("0")));
            detalleTransaccion.setFidOpeMoneda(cuentaBuscada.getFidPltTipoCuenta().getFidOpeMoneda());
            detalleTransaccion.setTipoCambioActual(cuentaBuscada.getFidPltTipoCuenta().getFidOpeTipoCambio().getPrecioPromedio());
            detalleTransaccion.setFidVfiTipoTransaccion(tipoTransaccion);
            detalleTransaccion.setEstado(true);
            verCuentas = false;
            this.tipoOperacion = "deposito";
            this.tipoTransaccion.setNombre("Deposito");


            // delegadoTranFinanciera.crear(tranFinanciera);

            //actualzia cuenta cliente
            delegadoDetalleTransaccion.crear(detalleTransaccion);
            cuentaBuscada.setEstadoCuenta(EstadoCuenta.Cancelado);
            delegado.editar(cuentaBuscada);




//detalleTransaccion.getIdTransaccion();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "volver";
    }

    public boolean buscarPorCajayMoneda(Caja caja, Moneda moneda) throws Exception {
        try {
            setSaldoCaja(delegadoSaldoCaja.buscarPorCajayMoneda(caja, moneda));
            return true;
        } catch (Exception e) {

            return false;

        }
    }

    /**
     * @return the tipoTransaccion
     */
    public TipoTransaccion getTipoTransaccion() {
        return tipoTransaccion;
    }

    /**
     * @param tipoTransaccion the tipoTransaccion to set
     */
    public void setTipoTransaccion(TipoTransaccion tipoTransaccion) {
        this.tipoTransaccion = tipoTransaccion;
    }

    /**
     * @return the detalleCaja
     */
    public DetalleCaja getDetalleCaja() {
        return detalleCaja;
    }

    /**
     * @param detalleCaja the detalleCaja to set
     */
    public void setDetalleCaja(DetalleCaja detalleCaja) {
        this.detalleCaja = detalleCaja;
    }

    /**
     * @return the caja
     */
    public Caja getCaja() {
        return caja;
    }

    /**
     * @param caja the caja to set
     */
    public void setCaja(Caja caja) {
        this.caja = caja;
    }

    /**
     * @return the saldoCaja
     */
    public SaldoCaja getSaldoCaja() {
        return saldoCaja;
    }

    /**
     * @param saldoCaja the saldoCaja to set
     */
    public void setSaldoCaja(SaldoCaja saldoCaja) {
        this.saldoCaja = saldoCaja;
    }

    /**
     * @return the nroTarjeta
     */
    public String getNroTarjeta() {
        return nroTarjeta;
    }

    /**
     * @param nroTarjeta the nroTarjeta to set
     */
    public void setNroTarjeta(String nroTarjeta) {
        this.nroTarjeta = nroTarjeta;
    }

    /**
     * @return the validacionTarjeta
     */
    public boolean isValidacionTarjeta() {
        return validacionTarjeta;
    }

    /**
     * @param validacionTarjeta the validacionTarjeta to set
     */
    public void setValidacionTarjeta(boolean validacionTarjeta) {
        this.validacionTarjeta = validacionTarjeta;
    }

    /**
     * @return the tarjetaDebito
     */
    public TarjetaDebito getTarjetaDebito() {
        return tarjetaDebito;
    }

    /**
     * @param tarjetaDebito the tarjetaDebito to set
     */
    public void setTarjetaDebito(TarjetaDebito tarjetaDebito) {
        this.tarjetaDebito = tarjetaDebito;
    }

    /**
     * @return the clave
     */
    public String getClave() {
        return clave;
    }

    /**
     * @param clave the clave to set
     */
    public void setClave(String clave) {
        this.clave = clave;
    }

    /**
     * @return the nrDocumento
     */
    public String getNrDocumento() {
        return nrDocumento;
    }

    /**
     * @param nrDocumento the nrDocumento to set
     */
    public void setNrDocumento(String nrDocumento) {
        this.nrDocumento = nrDocumento;
    }

    /**
     * @return the montoRetiro
     */
    public Double getMontoRetiro() {
        return montoRetiro;
    }

    /**
     * @param montoRetiro the montoRetiro to set
     */
    public void setMontoRetiro(Double montoRetiro) {
        this.montoRetiro = montoRetiro;
    }

    /**
     * @return the nroCtaDestino
     */
    public String getNroCtaDestino() {
        return nroCtaDestino;
    }

    /**
     * @param nroCtaDestino the nroCtaDestino to set
     */
    public void setNroCtaDestino(String nroCtaDestino) {
        this.nroCtaDestino = nroCtaDestino;
    }

    /**
     * @return the ctaTransferencia
     */
    public Cuenta getCtaTransferencia() {
        return ctaTransferencia;
    }

    /**
     * @param ctaTransferencia the ctaTransferencia to set
     */
    public void setCtaTransferencia(Cuenta ctaTransferencia) {
        this.ctaTransferencia = ctaTransferencia;
    }

    /**
     * @return the cuentaClienteTransferencia
     */
    public DetalleCuentaCliente getCuentaClienteTransferencia() {
        return cuentaClienteTransferencia;
    }

    /**
     * @param cuentaClienteTransferencia the cuentaClienteTransferencia to set
     */
    public void setCuentaClienteTransferencia(DetalleCuentaCliente cuentaClienteTransferencia) {
        this.cuentaClienteTransferencia = cuentaClienteTransferencia;
    }

    /**
     * @return the personaNaturalTransferencia
     */
    public PersonaNatural getPersonaNaturalTransferencia() {
        return personaNaturalTransferencia;
    }

    /**
     * @param personaNaturalTransferencia the personaNaturalTransferencia to set
     */
    public void setPersonaNaturalTransferencia(PersonaNatural personaNaturalTransferencia) {
        this.personaNaturalTransferencia = personaNaturalTransferencia;
    }

    /**
     * @return the personaJuridicaTransferencia
     */
    public PersonaJuridica getPersonaJuridicaTransferencia() {
        return personaJuridicaTransferencia;
    }

    /**
     * @param personaJuridicaTransferencia the personaJuridicaTransferencia to set
     */
    public void setPersonaJuridicaTransferencia(PersonaJuridica personaJuridicaTransferencia) {
        this.personaJuridicaTransferencia = personaJuridicaTransferencia;
    }

    /**
     * @return the titularTransferencia
     */
    public String getTitularTransferencia() {
        return titularTransferencia;
    }

    /**
     * @param titularTransferencia the titularTransferencia to set
     */
    public void setTitularTransferencia(String titularTransferencia) {
        this.titularTransferencia = titularTransferencia;
    }

    /**
     * @return the montoTransferencia
     */
    public Double getMontoTransferencia() {
        return montoTransferencia;
    }

    /**
     * @param montoTransferencia the montoTransferencia to set
     */
    public void setMontoTransferencia(Double montoTransferencia) {
        this.montoTransferencia = montoTransferencia;
    }
    /**
     * @return the montoDeposito
     */
}
